/**
 * 
 */
package net.jbaez.code;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*
 * Copyright 2008 DynamiCode 
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 *
 * http://www.apache.org/licenses/LICENSE-2.0 
 *
 * Unless required by applicable law or agreed to in writing, 
 * software distributed under the License is distributed on an 
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
 * either express or implied. See the License for the specific 
 * language governing permissions and limitations under the License. 
 */
/**
 * Clase de utilidad para el trabajo repetitivo
 * en la creacion de codigo
 */
public final class CodeUtility {
    
    /**
     * Verifica el texto pasado cumple
     * con las reglas de nombres 
     * @param name Nombre a verificar
     * @return <code>true</code> si el nombre es valido
     * o <code>false</code> si no lo es
     */
    public static boolean isValidName(String name){
	if(name == null || name.equals("")) return false;
	//Verificamos el inicio y todos los caracteres
	if(!Character.isJavaIdentifierStart(name.charAt(0))) return false;
	for (int i = 1; i < name.length(); i++) {
	    if(!Character.isJavaIdentifierPart(name.charAt(i))) return false;
	}
	return true;
    }
    /**
     * Retorna un valor que indica si el valor
     * es valido para un nombre de paquete
     * @param packageName Nombre del paquete
     * @return <code>true</code> si es valido o <code>false</code>
     * si no lo es
     */
    public static boolean isValidPackageName(String packageName){
	if(packageName.startsWith(".") || packageName.endsWith(".")) return false;
	//Iteramos por todos los caracteres que no son 
	//puntos(.) para comprobar si son validos
	String[] parts = packageName.split(".");
	for (int i = 0; i < parts.length; i++) {
	    for (int j = 0; j < parts[i].length(); j++) {
		if(!Character.isJavaIdentifierPart(parts[i].charAt(j))) return false;
	    }
	}
	//Si llegamos aca es que es valido
	return true;
    }
    /**
     * Crea un objeto de tipo JField
     * por medio de introspeccion
     * @param field El objeto a realizar el proceso de instrospeccion
     * @return La representacion del objeto pasado como
     * parametro
     */
    public static JField createField(Field field){
	//TODO Implementar la creacion de fields por medio
	//de instrospeccion
	return null;
    }
    /**
     * Crea un objeto de tipo JMethod
     * por medio de introspeccion
     * @param method El objeto a realizar el proceso de instrospeccion
     * @return La representacion del objeto pasado como
     * parametro
     */
    public static JMethod createMethod(Method method){
	//TODO Implementar la creacion de metodos
	//Por medio de instrospeccion
	return null;
    }
    /**
     * Crea un objeto de tipo JClass
     * por medio de introspeccion
     * @param clazz El objeto a realizar el proceso de instrospeccion
     * @return La representacion del objeto pasado como
     * parametro
     */
    public static JClass createClass(Class<?> clazz){
	//TODO Implementar la creacion de clases
	//por medio de instrospeccion
	return null;
    }
    
    public static JConstructor[] createConstructor(Class<?> clazz){
	//TODO Implementar la creacion de constructor por
	//introspeccion
	return null;
    }
    /**
     * Crea un objeto de tipo JConstructor
     * por medio de introspeccion
     * @param constructor El objeto a realizar el proceso de instrospeccion
     * @return La representacion del objeto pasado como
     * parametro
     */
    public static JConstructor createConstructor(Constructor<?> constructor){
	//TODO Implementar la creacion de constructores
	//por medio de instrospeccion
	return null;
    }
    /**
     * Crea un objeto de tipo JInterface
     * por medio de introspeccion
     * @param interfze El objeto a realizar el proceso de instrospeccion
     * @return La representacion del objeto pasado como
     * parametro
     */
    public static JInterface createInteface(Class<?> interfaze){
	//TODO Implementar la creacion de interfaces
	//por medio de instrospeccion
	return null;
    }
    /**
     * Crea un objeto de tipo JPackage
     * por medio de introspeccion
     * @param packagge El objeto a realizar el proceso de instrospeccion
     * @return La representacion del objeto pasado como
     * parametro
     */
    public static JPackage createPackage(Package packagge){
	//TODO Implementar la creacion de paquetes
	//Por medio de instrospeccion
	return null;
    }
    /**
     * Crea un objeto de tipo JAnnotation
     * por medio de introspeccion
     * @param clazz El objeto a realizar el proceso de instrospeccion
     * @return La representacion del objeto pasado como
     * parametro
     */
    public static JAnnotation createAnnotation(Class<? extends Annotation> clazz){
	//TODO Implementar la creacion de anotaciones
	//por medio de instrospeccion
	return null;
    }
}
